// Package service internal/service/post_service.go
package service

import (
	"github.com/gin-gonic/gin"
	"github.com/go-playground/validator/v10"
	"github.com/jinzhu/copier"
	"gozrd-admin-api/internal/entity/dto"
	"gozrd-admin-api/internal/entity/model"
	"gozrd-admin-api/internal/entity/vo"
	"gozrd-admin-api/internal/repository"
	"gozrd-admin-api/pkg/response"
)

// IPostService 岗位服务接口
type IPostService interface {
	CreateSysPost(c *gin.Context, postDTO dto.SysPostDto)
	GetSysPostList(c *gin.Context, pageNum, pageSize int, postName, postStatus, beginTime, endTime string)
	GetSysPostById(c *gin.Context, id int)
	UpdateSysPost(c *gin.Context, postDTO dto.SysPostDto)
	DeleteSysPostById(c *gin.Context, dto dto.SysPostIdDto)
	BatchDeleteSysPost(c *gin.Context, dto dto.DelSysPostDto)
	UpdateSysPostStatus(c *gin.Context, dto dto.UpdateSysPostStatusDto)
	QuerySysPostVoList(c *gin.Context)
}

// PostServiceImpl 岗位服务实现
type PostServiceImpl struct {
	postRepository repository.IPostRepository
	validator      *validator.Validate
}

// NewPostService 创建岗位服务实例
func NewPostService(postRepo repository.IPostRepository) IPostService {
	return &PostServiceImpl{
		postRepository: postRepo,
		validator:      validator.New(),
	}
}

// CreateSysPost 创建岗位
func (s *PostServiceImpl) CreateSysPost(c *gin.Context, postDTO dto.SysPostDto) {
	// 验证DTO
	if err := s.validator.Struct(postDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	// DTO转换为领域模型
	var post model.SysPost
	if err := copier.Copy(&post, &postDTO); err != nil {
		response.Fail(c, response.ErrParams, "数据转换失败: "+err.Error())
		return
	}

	// 调用Repository层
	err := s.postRepository.CreateSysPost(post)
	if err != nil {
		if err == repository.PostCodeExist {
			response.Fail(c, response.BadRequest, "岗位编码已存在")
			return
		}
		if err == repository.PostNameExist {
			response.Fail(c, response.BadRequest, "岗位名称已存在")
			return
		}
		response.Fail(c, response.ErrDatabase, "创建岗位失败："+err.Error())
		return
	}

	response.SuccessWithMessage(c, "创建成功", nil)
}

// GetSysPostList 查询岗位列表
func (s *PostServiceImpl) GetSysPostList(c *gin.Context, pageNum, pageSize int, postName, postStatus, beginTime, endTime string) {
	// 参数校验
	if pageNum < 1 || pageSize < 1 {
		response.Fail(c, response.ErrParams, "分页参数错误")
		return
	}

	// 调用Repository层获取数据
	posts, total, err := s.postRepository.GetSysPostList(pageNum, pageSize, postName, postStatus, beginTime, endTime)
	if err != nil {
		response.Fail(c, response.ErrDatabase, "获取岗位列表失败："+err.Error())
		return
	}

	// 转换为VO
	var postVOs []vo.SysPostVo
	if err := copier.Copy(&postVOs, &posts); err != nil {
		response.Fail(c, response.ServerError, "数据转换失败")
		return
	}

	// 构建分页结果
	result := map[string]interface{}{
		"total": total,
		"list":  postVOs,
	}

	response.Success(c, result)
}

// GetSysPostById 根据id查询岗位
func (s *PostServiceImpl) GetSysPostById(c *gin.Context, id int) {
	// 调用Repository层
	post, err := s.postRepository.GetSysPostById(id)
	if err != nil {
		response.Fail(c, response.ErrDatabase, "获取岗位详情失败："+err.Error())
		return
	}

	// 转换为VO
	var postVO vo.SysPostVo
	if err := copier.Copy(&postVO, &post); err != nil {
		response.Fail(c, response.ServerError, "数据转换失败")
		return
	}

	response.Success(c, postVO)
}

// UpdateSysPost 修改岗位
func (s *PostServiceImpl) UpdateSysPost(c *gin.Context, postDTO dto.SysPostDto) {
	// 验证DTO
	if err := s.validator.Struct(postDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	// DTO转换为领域模型
	var post model.SysPost
	if err := copier.Copy(&post, &postDTO); err != nil {
		response.Fail(c, response.ErrParams, "数据转换失败: "+err.Error())
		return
	}

	// 调用Repository层
	updatedPost, err := s.postRepository.UpdateSysPost(post)
	if err != nil {
		response.Fail(c, response.ErrDatabase, "更新岗位失败："+err.Error())
		return
	}

	// 转换为VO并返回
	var postVO vo.SysPostVo
	if err := copier.Copy(&postVO, &updatedPost); err != nil {
		response.Fail(c, response.ServerError, "数据转换失败")
		return
	}

	response.Success(c, postVO)
}

// DeleteSysPostById 删除岗位
func (s *PostServiceImpl) DeleteSysPostById(c *gin.Context, dto dto.SysPostIdDto) {
	// 验证DTO
	if err := s.validator.Struct(dto); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	// 调用Repository层
	err := s.postRepository.DeleteSysPostById(dto.Id)
	if err != nil {
		response.Fail(c, response.ErrDatabase, "删除岗位失败："+err.Error())
		return
	}

	response.Success(c, nil)
}

// BatchDeleteSysPost 批量删除岗位
func (s *PostServiceImpl) BatchDeleteSysPost(c *gin.Context, dto dto.DelSysPostDto) {
	// 验证DTO
	if err := s.validator.Struct(dto); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	// 调用Repository层
	err := s.postRepository.BatchDeleteSysPost(dto.Ids)
	if err != nil {
		response.Fail(c, response.ErrDatabase, "批量删除岗位失败："+err.Error())
		return
	}

	response.Success(c, nil)
}

// UpdateSysPostStatus 更新岗位状态
func (s *PostServiceImpl) UpdateSysPostStatus(c *gin.Context, dto dto.UpdateSysPostStatusDto) {
	// 验证DTO
	if err := s.validator.Struct(dto); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	// 调用Repository层
	err := s.postRepository.UpdateSysPostStatus(dto.Id, dto.PostStatus)
	if err != nil {
		response.Fail(c, response.ErrDatabase, "更新岗位状态失败："+err.Error())
		return
	}

	response.Success(c, nil)
}

// QuerySysPostVoList 查询岗位下拉列表
func (s *PostServiceImpl) QuerySysPostVoList(c *gin.Context) {
	// 调用Repository获取岗位列表
	posts, err := s.postRepository.QuerySysPostList()
	if err != nil {
		response.Fail(c, response.ErrDatabase, "获取岗位列表失败："+err.Error())
		return
	}

	// 转换为下拉选项VO
	var postVOs []map[string]interface{}
	for _, post := range posts {
		postVO := map[string]interface{}{
			"id":    int(post.ID),
			"label": post.PostName,
		}
		postVOs = append(postVOs, postVO)
	}

	response.Success(c, postVOs)
}
